﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.Practices.Unity;
using System.Web.ModelBinding;
using ddcCajamarca.BusinessEntities.Directorio;
using ddcCajamarca.BusinessLogic.Directorio.Service;
using System.Web.Security;
using System.Web.Profile;

namespace ddcCajamarca.Web.Directorio
{
    public partial class frmPersona : System.Web.UI.Page
    {
        [Dependency]
        public IPersonaBL personaBL { get; set; }

        [Dependency]
        public IUbigeoBL ubigeoBL { get; set; }

        [Dependency]
        public ITipoDocumentoBL tipoDocumentoBL { get; set; }

        [Dependency]
        public IActividadBL actividadBL { get; set; }

        [Dependency]
        public IProfesionBL profesionBL { get; set; }

        [Dependency]
        public IOrganizacionBL organizacionBL { get; set; }

        [Dependency]
        public IVocativoBL vocativoBL { get; set; }

        public bool puedeFinalizar;

        protected void Page_Load(object sender, EventArgs e)
        {
            puedeFinalizar = User.IsInRole("SuperAdmin") || User.IsInRole("Promotor") ? true : false;

            var accion = Request.QueryString["accion"];
            var id = Request.QueryString["id"];
            if (!Page.IsPostBack)
            {
                if (puedeFinalizar)
                {
                    if (accion != null && accion == "nuevo")
                    {
                        txtId.Visible = false;
                        lbId.Visible = false;
                        txtFechaReg.Text = DateTime.Today.ToShortDateString();

                        var persona = new Persona();

                        BindActividades(persona);

                        Cache.Insert("persona", persona);
                    }
                    else if (accion != null && id != null && accion == "editar")
                    {
                        Int32 idPersona = Int32.Parse(id);

                        var EditPerson = new Persona();

                        EditPerson = GetPersona(idPersona);

                        Cache.Insert("persona", EditPerson);

                        BindActividades(EditPerson);
                    }
                    else if (accion != null && id != null && accion == "delete")
                    {
                        Int32 idPersona2 = Int32.Parse(id);

                        var person = GetPersona(idPersona2);

                        String s = person.Imagen;

                        if (person.Imagen != "")
                        {
                            if (System.IO.File.Exists("D:/Inc/Proyecto/ddcCajamarca/ddcCajamarca.Web/Images/Directorio/Personas/" + s))
                            {
                                System.IO.File.Delete("D:/Inc/Proyecto/ddcCajamarca/ddcCajamarca.Web/Images/Directorio/Personas/" + s);
                            }
                        }

                        personaBL.DeletePersona(idPersona2);
                        Response.Redirect("frmListPersonas.aspx");
                    }
                    else 
                    {
                        Response.Redirect("frmListPersonas.aspx");
                    }
                }
                else
                {
                    if (accion != null && id != null && accion == "ver")
                    {
                        Int32 idPersona = Int32.Parse(id);

                        var EditPerson = new Persona();

                        EditPerson = GetPersona(idPersona);

                        Cache.Insert("persona", EditPerson);

                        BindActividades(EditPerson);

                        txtNombArt.ReadOnly = true;
                        ddlVocativo.Enabled = false;
                        txtNombre.ReadOnly = true;
                        txtApellidos.ReadOnly = true;
                        ddlProfesion.Enabled = false;
                        ddlOrganizacion.Enabled = false;
                        ddlTipoDocumentos.Enabled = false;
                        ddlUbigeo.Enabled = false;
                        txtnumDocumento.ReadOnly = true;
                        txtDireccion.ReadOnly = true;
                        txtDireccion2.ReadOnly = true;
                        txtTelefono1.ReadOnly = true;
                        txtTelefono2.ReadOnly = true;
                        txtTelefono3.ReadOnly = true;
                        txtFechaNac.ReadOnly = true;
                        txtEmail.ReadOnly = true;
                        txtPaginaWeb.ReadOnly = true;
                        cbAutoridad.Enabled = false;
                        ddlActividad.Enabled = false;
                        btnAgregar.Enabled = false;
                        btnGuardar.Visible = false;
                        btnCancelar2.Visible = false;
                        fuImagen.Enabled = false;
                        btnCancelar.Visible = true;
                    }
                    else
                    {
                        Response.Redirect("frmListVerPersonas.aspx");
                    }
                }

                
            }
        }

        public Persona GetPersona([QueryString("id")] Int32? id)
        {
            if (id.HasValue)
                return personaBL.GetFromPersonaById(id.Value);
            return null;
        }

        public int GetPersonaDNI()
        {
            var accion = Request.QueryString["accion"];

            if (accion == "nuevo")
            {
                return personaBL.GetPersonaByDNI(txtnumDocumento.Text, Int32.Parse(ddlTipoDocumentos.SelectedValue.ToString()), "Nuevo", 0);
            }
            else
            {
                return personaBL.GetPersonaByDNI(txtnumDocumento.Text, Int32.Parse(ddlTipoDocumentos.SelectedValue.ToString()), "Editar", Int32.Parse(txtId.Text));
            }
        }

        public IEnumerable<TipoDocumento> GetTiposDocumentos()
        {
            return tipoDocumentoBL.GetAllTipoDocumento();
        }

        public IEnumerable<Ubigeo> GetUbigeos()
        {
            return ubigeoBL.GetAllUbigeo();
        }

        public IEnumerable<Actividad> GetActividad()
        {
            return actividadBL.GetAllActividad();
        }

        public IEnumerable<Vocativo> GetVocativo()
        {
            return vocativoBL.GetAllVocativo();
        }

        public IEnumerable<Profesion> GetProfesion()
        {
            return profesionBL.GetAllProfesion();
        }

        public IEnumerable<Organizacion> GetOrganizacion()
        {
            return organizacionBL.GetAllOrganizaciones();
        }

        protected void btnGuardar_Click(object sender, EventArgs e)
        {
            var accion = Request.QueryString["accion"];
            var id = Request.QueryString["id"];

            var existe = GetPersonaDNI();

            if (existe == 0)
            {
                if (accion != null && accion == "nuevo")
                {
                    InsertPersona();
                }
            }
            else if (existe == 1)
            {
                if (accion != null && id != null)
                {
                    UpdatePersona();
                }
            }

        }

        public void UpdatePersona()
        {
            var upperson = Cache.Get("persona") as Persona;

            foreach (var row in lvDetalleActividad.Items)
            {
                var txtComent = row.FindControl("txtComentario") as TextBox;

                upperson.DetallePersonaActividades[row.DisplayIndex].Comentario = txtComent.Text;
            }

            BindActividades(upperson);
            Cache.Insert("persona", upperson);

            String s = "";

            if (fuImagen.HasFile)
            {
                fuImagen.SaveAs("D:/Inc/Proyecto/ddcCajamarca/ddcCajamarca.Web/Images/Directorio/Personas/" + txtnumDocumento.Text);
                s = txtnumDocumento.Text;
            }
            else
            {
                s = upperson.Imagen;
            }

            upperson.Id = Int32.Parse(txtId.Text);
            upperson.NombreArtistico = txtNombArt.Text;
            upperson.Nombre = txtNombre.Text;
            upperson.Apellidos = txtApellidos.Text;
            upperson.NumeroDocumento = txtnumDocumento.Text;
            upperson.Direccion = txtDireccion.Text;
            upperson.Direccion2 = txtDireccion2.Text;
            upperson.Telefono = txtTelefono1.Text;
            upperson.Telefono2 = txtTelefono2.Text;
            upperson.Telefono3 = txtTelefono3.Text;
            upperson.FechaReg = DateTime.Today.Date;
            upperson.FechaNac = !String.IsNullOrEmpty(txtFechaNac.Text) || txtFechaNac.Text != string.Empty ? DateTime.ParseExact(txtFechaNac.Text, "dd/MM/yyyy", null) : DateTime.MinValue;
            upperson.Email = txtEmail.Text;
            upperson.PaginaWeb = txtPaginaWeb.Text;
            upperson.Imagen = s;
            upperson.idTipoDoc = Int32.Parse(ddlTipoDocumentos.SelectedValue.ToString());
            upperson.idProfesion = Int32.Parse(ddlProfesion.SelectedValue.ToString());
            upperson.idVocativo = Int32.Parse(ddlVocativo.SelectedValue.ToString());
            upperson.idUbigeo = ddlUbigeo.SelectedValue.ToString();
            upperson.Autoridad = cbAutoridad.Checked;

            if (ddlOrganizacion.SelectedValue.ToString() == "Ninguna")
            {
                var detalleOrganizacionContacto = new DetalleOrganizacionContacto()
                {
                    FechaRegistro = DateTime.ParseExact(DateTime.Today.ToShortDateString(), "dd/MM/yyyy", null),
                    Estado = " ",
                    Cargo = " ",
                    IdPersona = upperson.Id,
                    IdOrganizacion = Int32.Parse(ddlOrganizacion.SelectedValue.ToString()),
                };

                upperson.DetalleOrganizacionContactos.Add(detalleOrganizacionContacto);
            }
            else
            {
                var detalleOrganizacionContacto = new DetalleOrganizacionContacto()
                {
                    FechaRegistro = DateTime.ParseExact(DateTime.Today.ToShortDateString(), "dd/MM/yyyy", null),
                    Estado = ddlEstado.SelectedValue.ToString(),
                    Cargo = txtCargo.Text,
                    IdPersona = upperson.Id,
                    IdOrganizacion = Int32.Parse(ddlOrganizacion.SelectedValue.ToString()),
                };

                upperson.DetalleOrganizacionContactos.Add(detalleOrganizacionContacto);
            }

            if (ModelState.IsValid)
                personaBL.UpdatePersona(upperson);
            Response.Redirect("frmListPersonas.aspx");
        }

        public void InsertPersona()
        {
            var person = Cache.Get("persona") as Persona;

            foreach (var row in lvDetalleActividad.Items)
            {
                var txtComent = row.FindControl("txtComentario") as TextBox;

                person.DetallePersonaActividades[row.DisplayIndex].Comentario = txtComent.Text;
            }

            BindActividades(person);
            Cache.Insert("persona", person);

            String s = "";

            if (fuImagen.HasFile)
            {
                fuImagen.SaveAs("D:/Inc/Proyecto/ddcCajamarca/ddcCajamarca.Web/Images/Directorio/Personas/" + txtnumDocumento.Text);
                s = txtnumDocumento.Text;
            }

            person.Id = 0;
            person.NombreArtistico = txtNombArt.Text;
            person.Nombre = txtNombre.Text;
            person.Apellidos = txtApellidos.Text;
            person.NumeroDocumento = txtnumDocumento.Text;
            person.Direccion = txtDireccion.Text;
            person.Direccion2 = txtDireccion2.Text;
            person.Telefono = txtTelefono1.Text;
            person.Telefono2 = txtTelefono2.Text;
            person.Telefono3 = txtTelefono3.Text;
            person.FechaReg = DateTime.ParseExact(DateTime.Today.ToShortDateString(), "dd/MM/yyyy", null);
            person.FechaNac = !String.IsNullOrEmpty(txtFechaNac.Text) || txtFechaNac.Text != string.Empty  ? DateTime.ParseExact(txtFechaNac.Text, "dd/MM/yyyy", null) : DateTime.MinValue;
            person.Email = txtEmail.Text;
            person.PaginaWeb = txtPaginaWeb.Text;
            person.Imagen = s;
            person.idTipoDoc = Int32.Parse(ddlTipoDocumentos.SelectedValue.ToString());
            person.idProfesion = Int32.Parse(ddlProfesion.SelectedValue.ToString());
            person.idVocativo = Int32.Parse(ddlVocativo.SelectedValue.ToString());
            person.idUbigeo = ddlUbigeo.SelectedValue.ToString();
            person.Autoridad = cbAutoridad.Checked;

            if (ddlOrganizacion.SelectedValue.ToString() == "Ninguna")
            {
                var detalleOrganizacionContacto = new DetalleOrganizacionContacto()
                {
                    FechaRegistro = DateTime.ParseExact(DateTime.Today.ToShortDateString(), "dd/MM/yyyy", null),
                    Estado = " ",
                    Cargo = " ",
                    IdPersona = person.Id,
                    IdOrganizacion = Int32.Parse(ddlOrganizacion.SelectedValue.ToString()),
                };

                person.DetalleOrganizacionContactos.Add(detalleOrganizacionContacto);
            }
            else
            {
                var detalleOrganizacionContacto = new DetalleOrganizacionContacto()
                {
                    FechaRegistro = DateTime.ParseExact(DateTime.Today.ToShortDateString(), "dd/MM/yyyy", null),
                    Estado = ddlEstado.SelectedValue.ToString(),
                    Cargo = txtCargo.Text,
                    IdPersona = person.Id,
                    IdOrganizacion = Int32.Parse(ddlOrganizacion.SelectedValue.ToString()),
                };

                person.DetalleOrganizacionContactos.Add(detalleOrganizacionContacto);
            }

            if (ModelState.IsValid)
                personaBL.AddPersona(person);
            Response.Redirect("frmListPersonas.aspx");
        }

        protected void lvDetalleActividades_ItemCommand(object sender, ListViewCommandEventArgs e)
        {
            if (e.CommandName == "QuitarActividad")
            {
                var accion = Request.QueryString["accion"];

                if (accion == "ver")
                {
                    foreach (var row in lvDetalleActividad.Items)
                    {
                        var btnQuitar = row.FindControl("btnQuitar") as Button;
                        btnQuitar.Enabled = false;

                        var txtComentario = row.FindControl("txtComentario") as TextBox;

                        txtComentario.ReadOnly = true;
                    }
                }
                else
                {
                    var actividadId = Int32.Parse(e.CommandArgument.ToString());

                    var personasac = Cache.Get("persona") as Persona;

                    var detalleact = personasac.DetallePersonaActividades.SingleOrDefault(i => i.IdActividad.Equals(actividadId));

                    personasac.DetallePersonaActividades.Remove(detalleact);

                    BindActividades(personasac);

                    Cache.Insert("persona", personasac);
                }                
            }
            else if (e.CommandName == "updateContinuarActividad")
            {
                var person = Cache.Get("persona") as Persona;

                foreach (var row in lvDetalleActividad.Items)
                {
                    var txtComent = row.FindControl("txtComentario") as TextBox;

                    person.DetallePersonaActividades[row.DisplayIndex].Comentario = txtComent.Text;
                }
            }
        }

        private void BindActividades(Persona persona)
        {
            hfIdPersona.Value = persona.Id.ToString();

            if (IsPostBack == false && persona.Id != 0)
            {
                txtId.Text = persona.Id.ToString();
                txtNombArt.Text = persona.NombreArtistico;
                txtNombre.Text = persona.Nombre;
                txtApellidos.Text = persona.Apellidos;
                txtnumDocumento.Text = persona.NumeroDocumento;
                txtDireccion.Text = persona.Direccion;
                txtDireccion2.Text = persona.Direccion2;
                txtTelefono1.Text = persona.Telefono;
                txtTelefono2.Text = persona.Telefono2;
                txtTelefono3.Text = persona.Telefono3;

                if (persona.FechaNac.ToString() != string.Empty || !String.IsNullOrEmpty(persona.FechaNac.ToString())) 
                { 
                    txtFechaNac.Text = DateTime.ParseExact(DateTime.Parse(persona.FechaNac.ToString()).ToShortDateString(), "dd/MM/yyyy", null).ToShortDateString(); 
                } 
                else 
                { 
                    txtFechaNac.Text = ""; 
                }

                txtFechaReg.Text = persona.FechaReg.ToShortDateString();

                txtEmail.Text = persona.Email;
                txtPaginaWeb.Text = persona.PaginaWeb;
                idImg.ImageUrl = "~/Images/Directorio/Personas/" + persona.Imagen;
                ddlTipoDocumentos.SelectedValue = persona.idTipoDoc.ToString();
                ddlProfesion.SelectedValue = persona.idProfesion.ToString();
                ddlVocativo.SelectedValue = persona.idVocativo.ToString();
                ddlUbigeo.SelectedValue = persona.idUbigeo;
                cbAutoridad.Enabled = persona.Autoridad;

                foreach (var item in persona.DetalleOrganizacionContactos)
                {
                    ddlEstado.SelectedValue = item.Estado.ToString();
                    txtCargo.Text = item.Cargo;
                    ddlOrganizacion.SelectedValue = item.IdOrganizacion.ToString();
                }
            }

            lvDetalleActividad.DataSource = persona.DetallePersonaActividades;
            lvDetalleActividad.DataBind();
        }

        protected void btnAgregar_Click(object sender, EventArgs e)
        {
            var actividadId = Int32.Parse(ddlActividad.SelectedValue);

            var actividad = actividadBL.GetFromActividadById(actividadId);

            var personasac = Cache.Get("persona") as Persona;

            var existe = personasac.DetallePersonaActividades.SingleOrDefault(i => i.IdActividad.Equals(actividadId));

            if (existe == null)
            {
                var detalleactividades = new DetallePersonaActividad()
                {
                    IdActividad = actividadId,
                    IdPersona = personasac.Id,
                    Actividad = actividad,
                    FechaRegistro = DateTime.ParseExact(DateTime.Today.ToShortDateString(), "dd/MM/yyyy", null),
                };

                personasac.DetallePersonaActividades.Add(detalleactividades);

                BindActividades(personasac);

                Cache.Insert("persona", personasac);
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Response.Redirect("frmListVerPersonas.aspx");
        }

        protected void btnCancelar2_Click(object sender, EventArgs e)
        {
            Response.Redirect("frmListPersonas.aspx");
        }
    }
}